<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>检测数据类型</title>
</head>
<body>
   <div>
       1、JavaScript共有八种数据类型:
          栈:原始数据类型:Undefined、Null、Boolean、String、Number
          堆:引用数据类型:Object、Array、Function
       2、ES6 中新增的数据类型:
          Symbol: 代表创建后独一无二且不可变的数据类型，它主要是为了解决可能出现的全局变量冲突的问题
          BigInt 是一种数字类型的数据，它可以表示任意精度格式的整数，使用 BigInt 可以安全地存储和操作大整数，即使这个数已经超出了 Number 能够表示的安全整数范围
   </div>
</body>
<script>
    // 数据类型检测的方式
    // 1、typeof
        console.log(typeof 2);  // number
        console.log(typeof true); // boolean
        console.log(typeof 'str'); // string
        console.log(typeof function(){});  // function
        console.log(typeof undefined);   // undefined
        console.log(typeof {});  // object
        console.log(typeof []);  // object
        console.log(typeof null); // object

    // 2、instanceof （只能正确判断引用数据类型，而不能判断基本数据类型）
        console.log(2 instanceof Number);  // false
        console.log(true instanceof Boolean);  // false
        console.log('str' instanceof String);  // false
        console.log([] instanceof Array);      // true
        console.log(function(){} instanceof Function);  // true
        console.log({} instanceof Object);  // true
    // 3、constructor （有两个作用，一是判断数据的类型，二是 对象实例通过 constrcutor 对象访问它的构造函数）
        console.log((2).constructor === Number); // true
        console.log((true).constructor === Boolean); // true
        console.log(('str').constructor === String); // true
        console.log(([]).constructor === Array); // true
        console.log((function() {}).constructor === Function); // true
        console.log(({}).constructor === Object); // true
    // 4、Object.prototype.toString.call() （使用 Object 对象的原型方法 toString 来判断数据类型）
        const a = Object.prototype.toString;
        console.log(a.call(2));    // [object Number]
        console.log(a.call(true));   // [object Boolean]
        console.log(a.call('str'));  // [object String]
        console.log(a.call([]));   // [object Array]
        console.log(a.call(function(){}));   // [object Function]
        console.log(a.call({}));   // [object Object]
        console.log(a.call(undefined));  // [object Undefined]
        console.log(a.call(null)); // [object Null]
</script>
</html>
